
Adélia Cruz
Neural Network Developer
TL;DR: Os fluxos de trabalho do CrewAI frequentemente encontram CAPTCHA; integrar o CapSolver permite que scripts automatizados os resolvam de forma eficiente.

Ao automatizar tarefas com o CrewAI, como raspagem de web ou navegação, os CAPTCHAs podem facilmente impedir seu fluxo de trabalho. Esses desafios são comuns ao acessar sites protegidos e podem interromper até scripts de automação bem projetados.
O CapSolver oferece uma maneira confiável de lidar com CAPTCHAs, permitindo que o CrewAI continue suas tarefas sem intervenção manual. Ao integrar o CapSolver, você pode otimizar a navegação automatizada e coleta de dados, mantendo-se compatível com as proteções dos sites.
CrewAI é um framework Python ágil e rápido para construir sistemas de agentes autônomos de IA. Desenvolvido do zero — totalmente independente do LangChain ou outros frameworks de agentes — o CrewAI oferece tanto facilidade de uso de alto nível quanto capacidades de personalização granular.
O CrewAI opera em dois paradigmas complementares:
| Componente | Descrição |
|---|---|
| Equipes | Equipes de agentes multiplas que colaboram de forma autônoma, permitindo resolução de problemas flexível com papéis especializados |
| Fluxos | Fluxos de trabalho baseados em eventos que oferecem controle preciso de execução para lógica de negócios complexa |
CapSolver é um serviço líder de resolução de CAPTCHA que fornece soluções baseadas em IA para contornar diversos desafios de CAPTCHA. Com suporte a vários tipos de CAPTCHA e tempos de resposta rápidos, o CapSolver se integra de forma suave em fluxos automatizados.
Ao construir agentes do CrewAI que interagem com sites — seja para coleta de dados, testes automatizados ou agregação de conteúdo — os desafios de CAPTCHA tornam-se um obstáculo significativo. Aqui está o porquê da integração importar:
Primeiro, instale os pacotes necessários:
pip install crewai
pip install 'crewai[tools]'
pip install requests
O CrewAI permite criar ferramentas personalizadas que os agentes podem usar para completar suas tarefas. Aqui está como criar uma ferramenta do CapSolver para lidar com desafios de CAPTCHA:
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SUA_CHAVE_API_DO_CAPSOLVER"
class CaptchaSolverInput(BaseModel):
"""Esquema de entrada para a ferramenta CaptchaSolver."""
website_url: str = Field(..., description="A URL do site com CAPTCHA")
website_key: str = Field(..., description="A chave do site do CAPTCHA")
captcha_type: str = Field(default="ReCaptchaV2TaskProxyLess", description="Tipo de CAPTCHA a ser resolvido")
class CaptchaSolverTool(BaseTool):
name: str = "captcha_solver"
description: str = "Resolve desafios de CAPTCHA usando a API do CapSolver. Suporta reCAPTCHA v2, v3, Turnstile e mais."
args_schema: Type[BaseModel] = CaptchaSolverInput
def _run(self, website_url: str, website_key: str, captcha_type: str = "ReCaptchaV2TaskProxyLess") -> str:
# Criar tarefa
create_task_url = "https://api.capsolver.com/createTask"
task_payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": captcha_type,
"websiteURL": website_url,
"websiteKey": website_key
}
}
response = requests.post(create_task_url, json=task_payload)
result = response.json()
if result.get("errorId") != 0:
return f"Erro ao criar tarefa: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Verificar resultado
get_result_url = "https://api.capsolver.com/getTaskResult"
for _ in range(60): # Máximo de 60 tentativas
time.sleep(2)
result_payload = {
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
response = requests.post(get_result_url, json=result_payload)
result = response.json()
if result.get("status") == "ready":
solution = result.get("solution", {})
return solution.get("gRecaptchaResponse") or solution.get("token")
elif result.get("status") == "failed":
return f"Tarefa falhou: {result.get('errorDescription')}"
return "Tempo esgotado ao esperar a solução do CAPTCHA"
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SUA_CHAVE_API_DO_CAPSOLVER"
class ReCaptchaV2Input(BaseModel):
"""Esquema de entrada para o resolvedor de reCAPTCHA v2."""
website_url: str = Field(..., description="A URL do site com reCAPTCHA v2")
website_key: str = Field(..., description="A chave do site do reCAPTCHA")
class ReCaptchaV2Tool(BaseTool):
name: str = "recaptcha_v2_solver"
description: str = "Resolve desafios de reCAPTCHA v2 usando o CapSolver"
args_schema: Type[BaseModel] = ReCaptchaV2Input
def _run(self, website_url: str, website_key: str) -> str:
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key
}
}
return self._solve_captcha(payload)
def _solve_captcha(self, payload: dict) -> str:
# Criar tarefa
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Erro: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Verificar resultado
for attempt in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
if result.get("status") == "failed":
return f"Falha: {result.get('errorDescription')}"
return "Tempo esgotado ao esperar a solução"
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SUA_CHAVE_API_DO_CAPSOLVER"
class ReCaptchaV3Input(BaseModel):
"""Esquema de entrada para o resolvedor de reCAPTCHA v3."""
website_url: str = Field(..., description="A URL do site com reCAPTCHA v3")
website_key: str = Field(..., description="A chave do site do reCAPTCHA")
page_action: str = Field(default="submit", description="O parâmetro de ação para reCAPTCHA v3")
class ReCaptchaV3Tool(BaseTool):
name: str = "recaptcha_v3_solver"
description: str = "Resolve desafios de reCAPTCHA v3 com verificação baseada em pontuação"
args_schema: Type[BaseModel] = ReCaptchaV3Input
def _run(
self,
website_url: str,
website_key: str,
page_action: str = "submit"
) -> str:
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV3TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key,
"pageAction": page_action
}
}
# Criar tarefa
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Erro: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Verificar resultado
for attempt in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
if result.get("status") == "failed":
return f"Falha: {result.get('errorDescription')}"
return "Tempo esgotado ao esperar a solução"
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SUA_CHAVE_API_DO_CAPSOLVER"
class TurnstileInput(BaseModel):
"""Esquema de entrada para o resolvedor de Turnstile."""
website_url: str = Field(..., description="A URL do site com Turnstile")
website_key: str = Field(..., description="A chave do site do widget Turnstile")
class TurnstileTool(BaseTool):
name: str = "turnstile_solver"
description: str = "Resolve desafios de Cloudflare Turnstile"
args_schema: Type[BaseModel] = TurnstileInput
def _run(self, website_url: str, website_key: str) -> str:
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key
}
}
# Criar tarefa
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Erro: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Verificar resultado
for attempt in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["token"]
if result.get("status") == "failed":
return f"Falha: {result.get('errorDescription')}"
return "Tempo esgotado ao esperar a solução"
import requests
import time
from crewai.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
CAPSOLVER_API_KEY = "SUA_CHAVE_API_DO_CAPSOLVER"
class CloudflareChallengeInput(BaseModel):
"""Esquema de entrada para o resolvedor de desafio Cloudflare."""
website_url: str = Field(..., description="A URL da página protegida")
proxy: str = Field(..., description="Proxy no formato: http://user:pass@ip:port")
class CloudflareChallengeTool(BaseTool):
name: str = "cloudflare_challenge_solver"
description: str = "Resolve páginas de desafio Cloudflare de 5 segundos"
args_schema: Type[BaseModel] = CloudflareChallengeInput
def _run(self, website_url: str, proxy: str) -> dict:
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiCloudflareTask",
"websiteURL": website_url,
"proxy": proxy
}
}
# Criar tarefa
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Erro: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Verificar resultado
for attempt in range(60):
time.sleep(3)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return {
"cookies": result["solution"]["cookies"],
"user_agent": result["solution"]["userAgent"]
}
if result.get("status") == "failed":
return f"Falha: {result.get('errorDescription')}"
return "Tempo esgotado ao esperar a solução"
Cada tipo de CAPTCHA requer um método de envio diferente:
Para o reCAPTCHA, injete o token em uma área de texto oculta e envie o formulário:
from selenium import webdriver
from selenium.webdriver.common.by import By
def submit_recaptcha_token(driver, token: str):
"""Injetar token de reCAPTCHA e enviar"""
# Tornar a área de texto oculta visível e definir o token
recaptcha_response = driver.find_element(By.ID, "g-recaptcha-response")
driver.execute_script("arguments[0].style.display = 'block';", recaptcha_response)
recaptcha_response.clear()
recaptcha_response.send_keys(token)
# Enviar o formulário
form = driver.find_element(By.TAG_NAME, "form")
form.submit()
Para o Turnstile, defina o token em um campo oculto:
def submit_turnstile_token(driver, token: str):
"""Injetar token de Turnstile e enviar"""
# Definir token no campo oculto
turnstile_input = driver.find_element(By.NAME, "cf-turnstile-response")
driver.execute_script("arguments[0].value = arguments[1];", turnstile_input, token)
# Enviar o formulário
form = driver.find_element(By.TAG_NAME, "form")
form.submit()
Para o Desafio Cloudflare (5s), o CapSolver retorna cookies e agente de usuário em vez de um token. Use-os em suas solicitações:
def submit_cloudflare_cookies(driver, cookies: dict, user_agent: str):
"""Usar cookies e agente de usuário para bypassar Cloudflare"""
# Adicionar cookies
driver.delete_all_cookies()
for name, value in cookies.items():
driver.add_cookie({'name': name, 'value': value})
# Definir agente de usuário
driver.execute_cdp_cmd("Network.setUserAgentOverride", {"userAgent": user_agent})
# Recarregar a página
driver.refresh()
import requests
def acessar_pagina_protegida_cloudflare(url: str, cf_solution: dict):
"""
Use a solução do desafio do Cloudflare para acessar a página protegida.
cf_solution contém 'cookies' e 'user_agent' do CapSolver.
"""
# Crie uma sessão com os cookies resolvidos
session = requests.Session()
# Defina os cookies da solução do CapSolver
for cookie in cf_solution["cookies"]:
session.cookies.set(cookie["name"], cookie["value"])
# Defina o user agent que foi usado para resolver
headers = {
"User-Agent": cf_solution["user_agent"]
}
# Agora você pode acessar a página protegida
response = session.get(url, headers=headers)
return response.text
### Exemplo Completo de Raspagem
```python
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
CHAVE_API_CAPSOLVER = "SUA_CHAVE_API_CAPSOLVER"
def resolver_recaptcha(url_website: str, chave_website: str) -> str:
"""Obter token reCAPTCHA do CapSolver"""
payload = {
"clientKey": CHAVE_API_CAPSOLVER,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": url_website,
"websiteKey": chave_website
}
}
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Erro: {result.get('errorDescription')}")
task_id = result.get("taskId")
for _ in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CHAVE_API_CAPSOLVER, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
if result.get("status") == "failed":
raise Exception(f"Falha: {result.get('errorDescription')}")
raise Exception("Tempo esgotado")
def raspagem_com_recaptcha(url_alvo: str, site_key: str):
"""Fluxo completo: resolver CAPTCHA → enviar → raspagem"""
driver = webdriver.Chrome()
driver.get(url_alvo)
try:
# 1. Resolver CAPTCHA
token = resolver_recaptcha(url_alvo, site_key)
# 2. Injetar token
campo_recaptcha = driver.find_element(By.ID, "g-recaptcha-response")
driver.execute_script("arguments[0].style.display = 'block';", campo_recaptcha)
campo_recaptcha.clear()
campo_recaptcha.send_keys(token)
# 3. Enviar formulário
driver.find_element(By.TAG_NAME, "form").submit()
# 4. Raspagem de conteúdo
time.sleep(3) # Aguarde o carregamento da página
return driver.page_source
finally:
driver.quit()
Para cenários que exigem automação de navegador dentro do CrewAI, você pode utilizar a extensão CapSolver:
Baixe a Extensão: Obtenha a extensão CapSolver em capsolver.com
Configure com Selenium/Playwright: Carregue a extensão na sua ferramenta de automação de navegador
Modo Auto-Resolução: A extensão detecta e resolve CAPTCHAs automaticamente
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Configure o Chrome com a extensão CapSolver
chrome_options = Options()
chrome_options.add_extension("caminho/para/extensao_capsolver.crx")
driver = webdriver.Chrome(options=chrome_options)
# A extensão resolverá automaticamente os CAPTCHAs
driver.get("https://exemplo.com/pagina-protegida")
def resolver_com_retentativa(self, payload: dict, max_retries: int = 3) -> str:
for tentativa in range(max_retries):
try:
resultado = self._resolver_captcha(payload)
if resultado:
return resultado
except Exception as e:
if tentativa == max_retries - 1:
raise
time.sleep(2 ** tentativa) # Backoff exponencial
def verificar_saldo() -> float:
response = requests.post(
"https://api.capsolver.com/getBalance",
json={"clientKey": CHAVE_API_CAPSOLVER}
)
return response.json().get("balance", 0)
Para acesso repetido a páginas iguais, cacheie tokens de CAPTCHA quando apropriado:
from functools import lru_cache
from datetime import datetime, timedelta
cache_captcha = {}
def obter_token_cachado(url_website: str, chave_website: str) -> str:
chave_cache = f"{url_website}:{chave_website}"
if chave_cache in cache_captcha:
token, timestamp = cache_captcha[chave_cache]
if datetime.now() - timestamp < timedelta(minutos=2):
return token
# Resolver novo CAPTCHA
novo_token = resolver_captcha(url_website, chave_website)
cache_captcha[chave_cache] = (novo_token, datetime.now())
return novo_token
Integrar o CapSolver ao CrewAI libera o potencial total de agentes de IA autônomos para tarefas baseadas na web. Combinando a orquestração de múltiplos agentes do CrewAI com a capacidade líder do mercado de resolução de CAPTCHA do CapSolver, os desenvolvedores podem construir soluções de automação robustas que lidam com os mecanismos de proteção mais desafiadores da web.
Seja para construir pipelines de extração de dados, frameworks de testes automatizados ou agentes inteligentes da web, a combinação CrewAI + CapSolver fornece a confiabilidade e escalabilidade necessárias para ambientes de produção.
Pronto para começar? Registre-se no CapSolver e use o código promocional CREWAI para obter um bônus de 6% em cada recarga!

CrewAI é um framework Python leve e rápido para criar sistemas de agentes de IA autônomos. Ele permite que os desenvolvedores criem equipes de agentes de IA que colaboram para realizar tarefas complexas, com suporte para tomada de decisão autônoma e controle preciso de fluxos de trabalho.
O CapSolver se integra ao CrewAI por meio de ferramentas personalizadas. Você cria uma ferramenta que encapsula a API do CapSolver, permitindo que seus agentes de IA resolvam desafios de CAPTCHA automaticamente quando encontrá-los durante operações na web.
O CapSolver suporta uma ampla gama de tipos de CAPTCHA, incluindo reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, Cloudflare Challenge, AWS WAF, GeeTest e muitos outros.
O CapSolver oferece preços competitivos com base no tipo e volume de CAPTCHAs resolvidos. Visite capsolver.com para detalhes de preços atuais. Use o código CREWAI para obter 6% de bônus em sua primeira recarga.
Sim! O CapSolver fornece uma API REST que pode ser integrada a qualquer framework Python, incluindo Scrapy, Selenium, Playwright e muito mais.
Sim, o CrewAI é de código aberto e licenciado sob MIT. O framework é gratuito para uso, embora você possa incorrer em custos com chamadas de API de LLM (como OpenAI) e serviços de resolução de CAPTCHA como o CapSolver.
A chave do site geralmente está no código-fonte da página. Procure por:
Aprenda arquitetura de raspagem web escalável em Rust com reqwest, scraper, raspagem assíncrona, raspagem de navegador headless, rotação de proxies e tratamento de CAPTCHA compatível.

Compare o Selenium vs Puppeteer para resolver CAPTCHA. Descubra benchmarks de desempenho, notas de estabilidade e como integrar o CapSolver para o máximo de sucesso.
